package com.example.springboot.service;

import cn.hutool.core.util.ObjectUtil;
import com.example.springboot.common.ResultCode;
import com.example.springboot.common.config.JwtTokenUtils;
import com.example.springboot.dao.AdminDao;
import com.example.springboot.dao.UserDao;
import com.example.springboot.entity.Account;
import com.example.springboot.entity.Admin;
import com.example.springboot.entity.User;
import com.example.springboot.exception.CustomException;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {

    @Resource
    UserDao userDao;
    @Resource
    AdminDao adminDao;

    public List<User> getAll() {
        return userDao.selectAll();
    }

    public User userRegister(User user) {

// 1.拿到用户输入的用户名 去数据库查询是否存在，如果存在抛出异常
        String userName = user.getUserName();//用户输入的用户名

        User dbUser = userDao.findByName(userName); //根据用户输入的用户名到数据查询的结果，也就说跟用户输入的用户名一致的用户对象

        if (ObjectUtil.isNotEmpty(dbUser)){ // 如果找到这个用户，抛出异常提示用户已存在
            throw new CustomException(ResultCode.USER_EXIST_ERROR);
        }

        if (ObjectUtil.isEmpty(user.getAvatar())) {
            user.setAvatar("http://localhost:8899/files/default.jpg");
        }

        //        设置默认密码
        if (ObjectUtil.isEmpty(user.getPassword())){
            user.setPassword("123");
        }

        user.setGradeName("test");

//  2.用 insertSelective 方法，把用户注册信息写到到数据表
        userDao.insertSelective(user);

        return user;

    }


    public User userLogin(User user) {

//        1.拿到用户传来的用户名，先到数据库查看这个用户名是否存在,如果不存在抛出异常：“用户不存在”
        User dbUser = userDao.findByName(user.getUserName());
        if (ObjectUtil.isEmpty(dbUser)){
            throw new CustomException(ResultCode.USER_ACCOUNT_ERROR);
        }
//        2.如果用户存在，则那用户输入的密码跟数据库找到的用户的密码比对，密码输入正确，允许登录
        String password = user.getPassword(); //用户输入的密码
        String dbPassword = dbUser.getPassword(); // 数据库找到用户的密码

        if (!password.equalsIgnoreCase(dbPassword)){
            throw new CustomException(ResultCode.USER_ACCOUNT_ERROR);
        }

        return dbUser;

    }


    public User findById(Integer id) {
        return userDao.findById(id);
    }

    public void delete(Integer id) {
        userDao.deleteByPrimaryKey(id);
    }


    public User userEdit(User user) {

        String userName = user.getUserName();
//     1.先校验用户名是不是为空： 如果用户名，为空，抛出异常
        if (ObjectUtil.isEmpty(userName)){
            throw new CustomException(ResultCode.USERNAME_ISNULL);
        }
        userDao.updateByPrimaryKeySelective(user);

        return user;
    }

    // 分页查询和模糊查询的方法
    public PageInfo<User> findPage(User search, Integer pageNum, Integer pageSize) {
//        1.获取当前用户，判断当前用户是否登录状态
        Account user = JwtTokenUtils.getCurrentUser();
        if (ObjectUtil.isEmpty(user)) {
            throw new CustomException(ResultCode.USER_NOT_LOGIN);
        }

        // 2.开启分页：开启分页这一句代码，一定要在操作数据的方法
        PageHelper.startPage(pageNum, pageSize);
        List<User> all = findByCondition(search);

        return PageInfo.of(all);
    }

    // 根据条件查询的方法
    public List<User> findByCondition(User search) {
        return userDao.findBySearch(search);
    }

    public User userRole(User user) {
//        1.执行删除操作:在用户表里删除这个用户
        Integer id = user.getId(); //拿到用户的Id
        delete(id);

//        2.把这个用户的信息新增到管理员表
        Admin admin = new Admin();
        admin.setAvatar(user.getAvatar());
        admin.setPassword(user.getPassword());
        admin.setRole(1);
        admin.setUserName(user.getUserName());
        admin.setAge(user.getAge());
        admin.setGender(user.getGender());
        admin.setPhone(user.getPhone());

        adminDao.insertSelective(admin); //把admin新增到管理员数据表

        return user;
    }


}
